//
// Created by liang on 2025/4/5.
//

#include "MainWindow.h"
#include <opencv2/opencv.hpp>
#include <QKeyEvent>
#include <QWindow>
#include <iostream>
#include <GlobalContext.h>
#include <windows.h>
#include <AutoItX3_DLL.h>
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>

#include "ExecuteThread.h"
#include "SSUtil.h"
using namespace SS;

HWND getWindowHandleOnWindows(const QString& windowName) {
    return FindWindowW(nullptr, reinterpret_cast<const wchar_t*>(windowName.utf16()));
}
// 宽字符转多字节字符串
std::string WideToMultiByte(const std::wstring& wideStr) {
    int len = WideCharToMultiByte(CP_ACP, 0, wideStr.c_str(), -1, NULL, 0, NULL, NULL);
    std::string multiByteStr(len, 0);
    WideCharToMultiByte(CP_ACP, 0, wideStr.c_str(), -1, &multiByteStr[0], len, NULL, NULL);
    return multiByteStr;
}
// 回调函数，用于处理每个枚举到的窗口
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) {
    const int bufferSize = 256;
    wchar_t windowTitle[bufferSize];

    // 获取窗口标题
    if (GetWindowTextW(hwnd, windowTitle, bufferSize) > 0) {
        std::string title = WideToMultiByte(windowTitle);

        qDebug() << L"窗口句柄: " << hwnd << L", 窗口标题: " << title ;
    }
    return TRUE;
}


// 定义 AutoItX 函数指针
typedef int (__stdcall *AutoItX_WinActivate)(const wchar_t* title, const wchar_t* text);
typedef int (__stdcall *AutoItX_MouseClick)(const wchar_t* button, int x, int y, int clicks, int speed);
typedef int (__stdcall *AutoItX_Send)(const wchar_t* keys);
typedef int(__stdcall* AutoItX_WinActivateByHandle)(HWND hWnd);
// 定义 AutoItX 函数指针
typedef int(__stdcall* AutoItX_WinList)(const wchar_t* title, const wchar_t* text, int* hwndArray, int* titleArray, int maxSize);
typedef wchar_t* (__stdcall* AutoItX_WinGetTitle)(int hwnd);
typedef HWND(WINAPI* AU3_WinGetHandleFunc)(LPCWSTR szTitle, LPCWSTR szText);


// 全局变量用于存储匹配的窗口句柄
std::vector<HWND> matchingWindows;

// 回调函数，用于枚举窗口
//BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) {
//    const int bufferSize = 256;
//    wchar_t windowTitle[bufferSize];
//    // 获取窗口标题
//    GetWindowTextW(hwnd, windowTitle, bufferSize);
//    // 获取要查找的窗口标题
//    const wchar_t* targetTitle = reinterpret_cast<const wchar_t*>(lParam);
//    if (wcscmp(windowTitle, targetTitle) == 0) {
//        // 如果标题匹配，将窗口句柄添加到向量中
//        matchingWindows.push_back(hwnd);
//    }
//    return TRUE;
//}

// 模板匹配识别数字
int recognizeDigit(const cv::Mat& digit, const std::vector<cv::Mat>& templates) {
    double minVal = 1.0;
    int recognizedDigit = -1;

    for (int i = 0; i < templates.size(); ++i) {
        cv::Mat result;
        cv::matchTemplate(digit, templates[i], result, cv::TM_SQDIFF_NORMED);
        double min;
        cv::minMaxLoc(result, &min, nullptr, nullptr, nullptr);
        if (min < minVal) {
            minVal = min;
            recognizedDigit = i;
        }
    }
    return recognizedDigit;
}
std::string UTF8ToGBK(const std::string& utf8Str) {
    int len = MultiByteToWideChar(CP_UTF8, 0, utf8Str.c_str(), -1, NULL, 0);
    wchar_t* wstr = new wchar_t[len + 1];
    memset(wstr, 0, len + 1);
    MultiByteToWideChar(CP_UTF8, 0, utf8Str.c_str(), -1, wstr, len);
    len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
    char* str = new char[len + 1];
    memset(str, 0, len + 1);
    WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
    std::string gbkStr = str;
    delete[] wstr;
    delete[] str;
    return gbkStr;
}

void MainWindow::startUpEvent() {
    auto picture_point = SSUtil::getPicturePoint("D:\\test_picture\\c.png","C:\\Users\\youkn\\Documents\\ShareX\\Screenshots\\2025-04\\Photos_SmMDE06H1r.png");
    qDebug() << "x: " << picture_point.x << " y: " << picture_point.y;
     QString projectPath = QCoreApplication::applicationDirPath();
    // tesseract::TessBaseAPI api;
    // // if (api.Init(nullptr, "eng", tesseract::OEM_LSTM_ONLY)) {
    // if (api.Init(NULL, "chi_sim")) {
    //     std::cerr << "Could not initialize tesseract." << std::endl;
    //
    // }

    // 设置识别模式为仅识别数字
    // api.SetVariable("tessedit_char_whitelist", "0123456789");
    // 打开图片
    // Pix* image = pixRead("C:\\Users\\youkn\\Documents\\ShareX\\Screenshots\\2025-04\\NVIDIA_Share_LYF9qFKIiT.png");
    // // Pix* image = pixRead("C:\\Users\\youkn\\Documents\\ShareX\\Screenshots\\2025-04\\Photos_L5ZGduYfre.png");
    // if (!image) {
    //     std::cerr << "Failed to read image." << std::endl;
    //     api.End();
    // }
    //
    // // 设置图片数据
    // api.SetImage(image);
    //
    // // 进行 OCR 识别
    // char* outText = api.GetUTF8Text();
    //
    // std::string outTextStr = UTF8ToGBK(outText);
    // qDebug() << "Recognized digits: " << outText;
    //
    // // 释放资源
    // api.End();
    // pixDestroy(&image);
    // delete[] outText;
//     std::vector<cv::Mat> templates;
//     for (int i = 0; i < 10; ++i) {
//         std::string filename = projectPath.toStdString() + "/resources/number/" + std::to_string(i) + ".png";
//         cv::Mat templateImg = cv::imread(filename, cv::IMREAD_GRAYSCALE);
//         if (templateImg.empty()) {
//             std::cerr << "Failed to load template: " << filename << std::endl;
//
//         }
//         templates.push_back(templateImg);
//     }
//     // 加载待识别图像
//     cv::Mat inputImage = cv::imread("D:\\net-share\\test_number.png", cv::IMREAD_GRAYSCALE);
//     if (inputImage.empty()) {
//         std::cerr << "Failed to load input image." << std::endl;
//
//     }
//
//     // 图像预处理
//     cv::Mat binaryImage;
//     cv::threshold(inputImage, binaryImage, 127, 255, cv::THRESH_BINARY_INV);
//
//     // 查找轮廓
//     std::vector<std::vector<cv::Point>> contours;
//     std::vector<cv::Vec4i> hierarchy;
//     cv::findContours(binaryImage.clone(), contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
//     std::string recognizedDigits;
//     // 遍历每个轮廓
//     for (const auto& contour : contours) {
//         cv::Rect boundingRect = cv::boundingRect(contour);
//         cv::Mat digit = binaryImage(boundingRect);
// //        cv::resize(digit, digit, templates[0].size());
//
//         // 识别数字
// //        int recognizedDigit = recognizeDigit(digit, templates);
// //        std::cout << "Recognized digit: " << recognizedDigit << std::endl;
//         // 识别数字
//         int recognizedDigit = recognizeDigit(digit, templates);
//         if (recognizedDigit != -1) {
//             recognizedDigits += std::to_string(recognizedDigit);
//         }
//         // 在原图上绘制识别结果
//         cv::rectangle(inputImage, boundingRect, cv::Scalar(0, 255, 0), 2);
//         cv::putText(inputImage, std::to_string(recognizedDigit), cv::Point(boundingRect.x, boundingRect.y - 10), cv::FONT_HERSHEY_SIMPLEX, 0.9, cv::Scalar(0, 255, 0), 2);
//     }
//     std::cout << "Recognized digits: " << recognizedDigits << std::endl;
//
//     // 显示结果
//     cv::imshow("Recognized Digits", inputImage);
//     cv::waitKey(0);

    // 读取左边和右边的图片
//    cv::Mat sourcePicture = cv::imread("D:\\script_picture\\exist.png");
//    cv::Mat targetPicture = cv::imread("D:\\test_picture\\c.png");
//
//
//
//    // 定义高亮黄色在 BGR 颜色空间的范围（根据实际情况调整）
//    cv::Scalar lowerYellow(38, 200, 255);  // BGR 格式，B: 0-50, G: 200-255, R: 200-255
//    cv::Scalar upperYellow(82, 221, 255);
//
//    // 对右边图片进行颜色阈值处理
//    cv::Mat mask;
//    inRange(targetPicture, lowerYellow, upperYellow, mask);
//
//    // 统计符合条件的像素数量
//    int yellowPixelCount = countNonZero(mask);
//
//    if (yellowPixelCount > 0) {
//        qDebug() << "右边图片存在左边的高亮黄色。";
//    } else {
//         qDebug() << "右边图片不存在左边的高亮黄色。";
//    }
    // QString projectPath = QCoreApplication::applicationDirPath();
    // QString fileName = projectPath + "/a.png";
    // const std::map<HWND, TaskWindow>& constRef = windowControl.getAllWindows();
    // for (auto refItem : constRef) {
    //     SSUtil::CaptureWindow(refItem.first, fileName.toStdString().c_str());
    // }
    // std::cout << "123" << std::endl;
    // std::string imagePath = "F:\\02.png";
    // cv::Mat image = cv::imread(imagePath);
    //
    // // 检查图片是否成功读取
    // if (image.empty()) {
    //     QString errMsg = QString::fromStdString("无法读取图片: " + imagePath);
    //     qDebug() << errMsg;
    //     return ;
    // }
    // qDebug()<< "启动成功";
    // // 输出图片的基本信息
    // qDebug() << "图片宽度: " << image.cols ;
    // qDebug() << "图片高度: " << image.rows;
    // qDebug() << "图片通道数: " << image.channels();
    // QString windowName = "幻唐志"; // 替换为你要查找的窗口名
    //
    // HWND hand = getWindowHandleOnWindows(windowName);
    // qDebug() << "窗口句柄: " << hand;
    // for (QWindow* window : QGuiApplication::allWindows()) {
    //
    //     qDebug() << "窗口名称: " << window->title();
    // }
    //
    // if (!EnumWindows(EnumWindowsProc, 0)) {
    //     qDebug() << "枚举窗口失败，错误代码: " << GetLastError() ;
    //
    // }


    // // 加载 AutoItX DLL
    // HINSTANCE hDll = LoadLibrary(L"D:\\software\\AutoIt3\\AutoItX\\AutoItX3_x64.dll");
    // if (hDll == NULL) {
    //     qDebug() << "无法加载 AutoItX3.dll，错误代码: " << GetLastError() ;
    //     return;
    // }
//    // 获取函数地址
    // AutoItX_WinActivate WinActivate = (AutoItX_WinActivate)GetProcAddress(hDll, "AU3_WinActivate");
//    AutoItX_MouseClick MouseClick = (AutoItX_MouseClick)GetProcAddress(hDll, "AU3_MouseClick");
//    AutoItX_Send Send = (AutoItX_Send)GetProcAddress(hDll, "Send");
//    // 获取函数地址
    // AutoItX_WinList WinList = (AutoItX_WinList)GetProcAddress(hDll, "WinList");
    // AutoItX_WinActivateByHandle WinActivateByHandle =
    //         (AutoItX_WinActivateByHandle)GetProcAddress(hDll, "AU3_WinActivateByHandle");
    // AU3_WinGetHandleFunc AU3_WinGetHandle = (AU3_WinGetHandleFunc)GetProcAddress(hDll, "AU3_WinGetHandle");

//    AutoItX_WinGetTitle WinGetTitle = (AutoItX_WinGetTitle)GetProcAddress(hDll, "WinGetTitle");
//
//
//    if (WinActivate == NULL || MouseClick == NULL || Send == NULL) {
//        qDebug() << "无法获取函数地址" ;
//        FreeLibrary(hDll);
//    }
    // const int maxSize = 100;
    // int hwndArray[maxSize];
    // int titleArray[maxSize];

    // 获取窗口列表
//    AU3_WinGetClassList(L"", L"", hwndArray, titleArray, maxSize);
//
//    // 输出每个窗口的句柄和标题
//    for (int i = 0; i < count; ++i) {
//        int hwnd = hwndArray[i];
//        wchar_t* title = WinGetTitle(hwnd);
//        if (title != nullptr) {
//            qDebug() << L"窗口句柄: " << hwnd << L", 窗口标题: " << title ;
//        }
//    }
//
//    // 释放 DLL
//    FreeLibrary(hDll);
//    AU3_Init();
    // HWND hwnd = FindWindow(NULL, TEXT("幻唐志 - 天下无双"));
    // HWND hwnd2 = (HWND)0x00010486;
    // int aa =3;
    // typedef int(__stdcall* AutoItX_Send)(LPCWSTR szSendText, int nMode);
    // AutoItX_Send AU3_Send =
    //         (AutoItX_Send)GetProcAddress(hDll, "AU3_Send");
    // // 定义函数指针
    // typedef void(__stdcall* AutoItX_Sleep)(int nMilliseconds);
    // AutoItX_Sleep AU3_Sleep =
    //         (AutoItX_Sleep)GetProcAddress(hDll, "AU3_Sleep");
    // WinActivateByHandle(hwnd);
    // AU3_Sleep(1000);
    //
    // AU3_Send(L"{ALT down}{E}", 0);
//    WinActivate();
}



void SS::MainWindow::keyPressEvent(QKeyEvent *event)
{
    GlobalContext* context = SS::GlobalContext::getInstance();
    qDebug()<<" is start up:" << context->getIsStartUp();
    if (event->key() == Qt::Key_F5) {
        static bool variable = false;
        variable =!variable;
        qDebug()<< "hello world";
        context->setIsStartUp(!context->getIsStartUp());
        if (context->getIsStartUp()) {
            for (auto& execute_thread : this->threads) {
                execute_thread->weakAll();
            }
        }

    }
}
